package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.ListableBeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.PromocionBonoDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbPromocionBono;
import com.pe.pgn.clubpgn.domain.ClpdRangoPromocion;
import com.pe.pgn.clubpgn.domain.ClpdTipoBono;
import com.pe.pgn.clubpgn.domain.ClprPromocionEstacion;
import com.pe.pgn.clubpgn.domain.beans.BNEstacion;
import com.pe.pgn.clubpgn.domain.beans.BNPromocionBono;
import com.pe.pgn.clubpgn.domain.beans.BNPromocionEstacion;
import com.pe.pgn.clubpgn.util.CollectionUtil;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;
import com.pe.pgn.clubpgn.webapp.util.ValidationUtil;

@Repository("promocionBonoDao")
public class PromocionBonoDaoImpl extends GenericDaoHibernate<ClpbPromocionBono, Long>implements PromocionBonoDao{

	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public PromocionBonoDaoImpl() {
		super(ClpbPromocionBono.class);
	}

	@SuppressWarnings("unchecked")
	public List<ClpbPromocionBono> listarPromocionesBono(boolean addItemDefault) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	id, de_nombre as deNombre, ");
		query.append(" 	to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"') as inicioVigencia, ");
		query.append(" 	to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"') as finVigencia, ");
		query.append(" 	va_monto_minimo as vaMontoMinimo, st_promocion_bono as strPromocionBono ");
		query.append(" from clpb_promocion_bono ");
		query.append(" where st_promocion_bono = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" order by da_fin_vigencia desc ");
		
		List<ClpbPromocionBono> listFinal = new ArrayList<ClpbPromocionBono>();
		List<ClpbPromocionBono> list = findListOfBeans(query.toString(), null, ClpbPromocionBono.class);
		
		if(addItemDefault){
			ClpbPromocionBono bean = new ClpbPromocionBono();
			bean.setId(new Long("-1"));
			bean.setDeNombre("----");
			listFinal.add(bean);
		}
		
		listFinal.addAll(list);		
		return listFinal;
	}

	public List<ClpbPromocionBono> buscarPromocionesBono(String dePromoBono,
			String iniVigencia, String finVigencia, String stPromoBono) {

		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" select ");
		query.append(" 	id, de_nombre as deNombre, ");
		query.append(" 	to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"') as inicioVigencia, ");
		query.append(" 	to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"') as finVigencia, ");
		query.append(" 	va_monto_minimo as vaMontoMinimo, st_promocion_bono as strPromocionBono ");
		query.append(" from clpb_promocion_bono ");
		query.append(" where 1 = 1 ");
		
		if(StringUtils.isNotBlank(dePromoBono)){
			query.append(" and upper(de_nombre) like upper(?)");
			params.add("%"+dePromoBono+"%");
		}
		
		if(StringUtils.isNotBlank(iniVigencia)){
			query.append(" and to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') >= to_date(?,'"+CLPConstantes.DATE_PATTERN+"')");
			params.add(iniVigencia);
		}
		
		if(StringUtils.isNotBlank(finVigencia)){
			query.append(" and to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <= to_date(?,'"+CLPConstantes.DATE_PATTERN+"')");
			params.add(finVigencia);
		}
		
		if(StringUtils.isNotBlank(stPromoBono) && !"-1".equals(stPromoBono)){
			query.append(" and st_promocion_bono = ?");
			params.add(stPromoBono);
		}
		
		query.append(" order by da_fin_vigencia desc ");
		
		System.out.println("* PromocionBonoDaoImpl.buscarPromocionesBono: "+query.toString());
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		
		if(params.size() > 0){
			list = jdbcTemplate.queryForList(query.toString(), params.toArray());
		}else{
			list = jdbcTemplate.queryForList(query.toString());
		}
		
		ClpbPromocionBono bean = null;
		List<ClpbPromocionBono> listBean = new ArrayList<ClpbPromocionBono>();
		if(ValidationUtil.validateList(list)){
			for (Map<String, Object> map : list) {
				
				bean = new ClpbPromocionBono();
				bean.setId(new Long(map.get("id").toString()));
				bean.setDeNombre(map.get("deNombre").toString());
				bean.setInicioVigencia(map.get("inicioVigencia").toString());
				bean.setFinVigencia(map.get("finVigencia").toString());
				bean.setVaMontoMinimo(new BigDecimal(map.get("vaMontoMinimo").toString()));
				bean.setStrPromocionBono(map.get("strPromocionBono").toString());
				
				listBean.add(bean);
			}
		}
		
		return listBean;
	}

	public ClpbPromocionBono obtenerPromocionBono(Long idPromocionBono) {

		ClpbPromocionBono bean = new ClpbPromocionBono();
		StringBuffer query = new StringBuffer();
		
		query.append(" select ");
		query.append(" 	prom.id, prom.de_nombre as deNombre, prom.co_tipo_bono as coTipoBono, ");
		query.append(" 	to_char(prom.da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"') as inicioVigencia, ");
		query.append(" 	to_char(prom.da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"') as finVigencia, ");
		query.append(" 	prom.va_monto_minimo as vaMontoMinimo, prom.st_promocion_bono as strPromocionBono, prom.st_bloqueado as strBloqueado, ");
		query.append(" 	prom.st_caducar_bono as strCaducarBono, tipobon.de_tipo_bono as deTipoBono, tipobon.va_monto as vaTipoBono ");
		query.append(" from clpb_promocion_bono prom ");
		query.append(" join clpd_tipo_bono tipobon on tipobon.id = prom.co_tipo_bono ");
		query.append(" where prom.id = ").append(idPromocionBono);
		
		List<Map<String, Object>> list = jdbcTemplate.queryForList(query.toString());
		if(ValidationUtil.validateList(list)){
			
			Calendar calIni = null;
			Calendar calFin = null;
			Map<String, Object> map = (HashMap<String, Object>)list.get(0);
			String deNombre = map.get("deNombre").toString();
			String coTipoBono = map.get("coTipoBono").toString();
			String deTipoBono = map.get("deTipoBono").toString();
			String vaTipoBono = map.get("vaTipoBono").toString();
			String iniVigencia = map.get("inicioVigencia").toString();
			String finVigencia = map.get("finVigencia").toString();
			String montoMinimo = map.get("vaMontoMinimo").toString();			
			String stPromocionBono = map.get("strPromocionBono").toString();
			String stCaducarBono = map.get("strCaducarBono").toString();
			String stBloqueado = map.get("strBloqueado").toString();
			
			ClpdTipoBono clpdTipoBono = new ClpdTipoBono();
			clpdTipoBono.setId(new Long(coTipoBono));
			
			try {
				calIni = CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, iniVigencia);
				calFin = CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, finVigencia);
			} catch (ParseException e) {
				calIni = null;
				calFin = null;
			}
			
			bean.setId(idPromocionBono);
			bean.setDeNombre(deNombre);
			bean.setDaInicioVigencia(calIni);
			bean.setDaFinVigencia(calFin);
			bean.setInicioVigencia(iniVigencia);
			bean.setFinVigencia(finVigencia);
			bean.setClpdTipoBono(clpdTipoBono);
			bean.setCoTipoBono(coTipoBono);
			bean.setDeTipoBono(deTipoBono);
			bean.setVaTipoBono(vaTipoBono);
			bean.setVaMontoMinimo(new BigDecimal(montoMinimo));
			
			if(CLPConstantes.ST_VERDADERO.equals(stPromocionBono)){
				bean.setStPromocionBono(true);
			}else{
				bean.setStPromocionBono(false);
			}
			
			if(CLPConstantes.ST_VERDADERO.equals(stCaducarBono)){
				bean.setStCaducarBono(true);
			}else{
				bean.setStCaducarBono(false);
			}
			
			if(CLPConstantes.ST_VERDADERO.equals(stBloqueado)){
				bean.setStBloqueado(true);
			}else{
				bean.setStBloqueado(false);
			}
		}
		
		return bean;
	}

	public Map<String, Object> guardarPromocionBono(
			ClpbPromocionBono promocionBono) {
		
		Map<String, Object> mapMsg = new HashMap<String, Object>();
		
		try{
		
			if(promocionBono.getId() == null){
				promocionBono.setStPromocionBono(true);
				promocionBono.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
				promocionBono.setDaFechaCreacion(Calendar.getInstance());
			}
			else{
				promocionBono.setCoUsuarioModificador(getUsuarioLogueado().getUsername());
				promocionBono.setDaFechaModificacion(Calendar.getInstance());
			}
			
			getHibernateTemplate().saveOrUpdate(promocionBono);
			getHibernateTemplate().flush();
		
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.SUCCESS);
			mapMsg.put("id", promocionBono.getId());
			
		}catch(Exception e){
			
			getHibernateTemplate().clear();
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
			mapMsg.put("detalle", e.getMessage());
		}
		
		return mapMsg;
	}

	public int eliminarPromocionBono(Long id) {

		String[] arrayStr = new String[2];
		StringBuffer query = new StringBuffer();
		
		query.append(" update clpb_promocion_bono ");
		query.append(" set st_promocion_bono = '").append(CLPConstantes.ST_FALSO).append("'");
		query.append(" where id = ").append(id);
		arrayStr[0] = query.toString();
		
		query = new StringBuffer();
		query.append(" update clpd_rango_promocion ");
		query.append(" set st_rango_promocion = '").append(CLPConstantes.ST_FALSO).append("'");
		query.append(" where co_promocion_bono = ").append(id);
		arrayStr[1] = query.toString();
		
		int[] rows = jdbcTemplate.batchUpdate(arrayStr);
		return rows[0];
	}

	public boolean validarTraslapePromoBono(ClpbPromocionBono promocionBono) {

		String fechaInicio = promocionBono.getInicioVigencia();
		String fechaFin = promocionBono.getFinVigencia();
		
		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" select count(id) ");
		query.append(" from clpb_promocion_bono ");
		query.append(" where st_promocion_bono = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		query.append(" and (");
		
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <= to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");		
		query.append(" and to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') >= to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') >= to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");		
		query.append(" and to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <= to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"')    >=  to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <= to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"')    >  to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <  to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') >= to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') <=  to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" 	 or ");
		query.append(" (to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"')");
		query.append(" and to_date(to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"'), '"+CLPConstantes.DATE_PATTERN+"') = to_date(?, '"+CLPConstantes.DATE_PATTERN+"'))");
		params.add(fechaInicio);
		params.add(fechaFin);
		
		query.append(" )");
		
		if(promocionBono.getId() != null)
			query.append(" and id != ").append(promocionBono.getId());
		
		int rows = 0;		
		if(params.size() > 0){
			rows = jdbcTemplate.queryForInt(query.toString(), params.toArray());
		}else{
			rows = jdbcTemplate.queryForInt(query.toString());
		}
		
		if(rows > 0)
			return false;
		
		return true;
	}

	public boolean validarMontoMinimo(ClpbPromocionBono promocionBono) {

		String idTipoBono = promocionBono.getCoTipoBono();
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" va_monto ");
		query.append(" from clpd_tipo_bono ");
		query.append(" where id = ").append(idTipoBono);
		
		List<Map<String, Object>> list = jdbcTemplate.queryForList(query.toString());
		Map<String, Object> map = list.get(0);
		
		double vaMontoMin = promocionBono.getVaMontoMinimo().doubleValue();
		double vaMonto = Double.parseDouble(map.get("va_monto").toString());
		
		if(vaMontoMin >= vaMonto){
			return true;
		}
		
		return false;
	}

	public boolean validarDuplicidadDesc(ClpbPromocionBono promocionBono) {

		List<Object> params = new ArrayList<Object>();
		StringBuffer query = new StringBuffer();
		
		query.append(" select ");
		query.append(" 	count(id) ");
		query.append(" from clpb_promocion_bono ");
		query.append(" where trim(upper(de_nombre)) like upper(?)");
		query.append(" and st_promocion_bono = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		params.add(promocionBono.getDeNombre().trim());
		
		if(promocionBono.getId() != null)
			query.append(" and id != ").append(promocionBono.getId());
		
		int rows = 0;		
		if(params.size() > 0){
			rows = jdbcTemplate.queryForInt(query.toString(), params.toArray());
		}else{
			rows = jdbcTemplate.queryForInt(query.toString());
		}
		
		if(rows > 0)
			return true;
		
		return false;
	}

	@SuppressWarnings("unchecked")
	public List<ClpdRangoPromocion> listarRangoPromocion(Long id) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append("	id, va_consumo_inicio as vaConsumoInicio, ");
		query.append("	va_consumo_fin as vaConsumoFin, ");
		query.append("	va_cantidad as vaCantidad ");
		query.append(" from clpd_rango_promocion ");
		query.append(" where co_promocion_bono = ").append(id);
		query.append(" order by va_consumo_inicio asc ");
		
		return findListOfBeans(query.toString(), null, ClpdRangoPromocion.class);
	}

	public int eliminarRangos(Long idRangoPromocion) {

		StringBuffer query = new StringBuffer();
		query.append(" delete from clpd_rango_promocion ");
		query.append(" where id = ").append(idRangoPromocion);
		
		return jdbcTemplate.update(query.toString());
	}

	public Map<String, Object> guardarRangos(String idPromocionBono, String vaConsumoInicio,
			String vaConsumoFin, String vaCantidad, String stEsRangoFinal) {

		Map<String, Object> mapMsg = new HashMap<String, Object>();
		
		try{
			
			ClpbPromocionBono promocionbono = new ClpbPromocionBono();
			promocionbono.setId(new Long(idPromocionBono));
			
			ClpdRangoPromocion bean = new ClpdRangoPromocion();		
			bean.setVaConsumoInicio(new BigDecimal(vaConsumoInicio));
			
			if(StringUtils.isNotBlank(vaConsumoFin))
			bean.setVaConsumoFin(new BigDecimal(vaConsumoFin));
			
			bean.setClpbPromocionBono(promocionbono);
			bean.setVaCantidad(new Long(vaCantidad));
			bean.setStRangoPromocion(true);
			
			if(stEsRangoFinal.equalsIgnoreCase("true"))
			bean.setStEsRangoFinal(true);
			
			bean.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			bean.setDaFechaCreacion(Calendar.getInstance());
		
			getHibernateTemplate().saveOrUpdate(bean);
			getHibernateTemplate().flush();

			mapMsg.put(CLPConstantes.MSG, CLPConstantes.SUCCESS);
			mapMsg.put("id", bean.getId());
			
		}catch(Exception e){
			
			getHibernateTemplate().clear();
			mapMsg.put(CLPConstantes.MSG, CLPConstantes.ERROR);
			mapMsg.put("detalle", e.getMessage());
		}
		
		return mapMsg;
	}

	public boolean existeRangoFinal(String idPromocionBono) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" count(id) ");
		query.append(" from clpd_rango_promocion ");
		query.append(" where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and st_es_rango_final = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and co_promocion_bono = ").append(idPromocionBono);
		
		System.out.println("* existeRangoFinal :"+query.toString());
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			return true;
		}
		
		return false;
	}

	public boolean verificarSiTieneRangos(Long idPromocionBono) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" count(id) ");
		query.append(" from clpd_rango_promocion ");
		query.append(" where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and co_promocion_bono = ").append(idPromocionBono);
		
		System.out.println("* verificarSiTieneRangos :"+query.toString());
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			return true;
		}
		
		return false;
	}

	public boolean validarConsumoIniRangoFinal(String vaConsumoInicio,
			String idPromocionBono) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" count(id) ");
		query.append(" from clpd_rango_promocion ");
		query.append(" where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and co_promocion_bono = ").append(idPromocionBono);
		query.append(" and va_consumo_fin > ").append(vaConsumoInicio);
		
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			return false;
		}
		
		return true;
	}

	public boolean validarNoMayorARangoFinal(String vaConsumoInicio,
			String vaConsumoFin, String idPromocionBono) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" count(id) ");
		query.append(" from clpd_rango_promocion ");
		query.append(" where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and st_es_rango_final = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and co_promocion_bono = ").append(idPromocionBono);
		query.append(" and va_consumo_inicio <= ").append(vaConsumoInicio);
		
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			return false;
		}else{
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" count(id) ");
			query.append(" from clpd_rango_promocion ");
			query.append(" where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and st_es_rango_final = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" and co_promocion_bono = ").append(idPromocionBono);
			query.append(" and va_consumo_inicio < ").append(vaConsumoFin);
			
			rows = jdbcTemplate.queryForInt(query.toString());
			if(rows > 0){
				return false;
			}
		}
		
		return true;
	}

	public boolean validarRegistroConsecutivo(String vaConsumoInicio,
			String vaConsumoFin, String idPromocionBono, String stEsRangoFinal) {

		//primero verificando si existen registros
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	count(id) ");
		query.append(" from clpd_rango_promocion ");
		query.append(" where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and co_promocion_bono = ").append(idPromocionBono);
		
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			
			//validando en el caso de rango final
			if(stEsRangoFinal.equalsIgnoreCase("true")){
				
				query = new StringBuffer();
				query.append(" select count(*) from ( ");				
				query.append(" 		select ");
				query.append("			max(va_consumo_fin) as registromax ");
				query.append(" 		from clpd_rango_promocion ");
				query.append(" 		where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" 		and st_es_rango_final = '").append(CLPConstantes.ST_FALSO).append("'");
				query.append(" 		and co_promocion_bono = ").append(idPromocionBono);
				query.append(" ) slct ");
				query.append(" where slct.registromax = ").append(vaConsumoInicio);
				
				rows = jdbcTemplate.queryForInt(query.toString());
				if(rows > 0){ // si existen registros entonces proceder a registrar
					return true;
				}else{
					return false;
				}
				
			}else{
				
				///////////////////////////////////////////////////////////////////
				//validando en el caso de los demas rangos (Que no son Rango Final)
				///////////////////////////////////////////////////////////////////
				
				query = new StringBuffer();
				query.append(" select count(*) from ( ");				
				query.append(" 		select ");
				query.append("			max(va_consumo_fin) as finalmax ");
				query.append(" 		from clpd_rango_promocion ");
				query.append(" 		where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" 		and st_es_rango_final = '").append(CLPConstantes.ST_FALSO).append("'");
				query.append(" 		and co_promocion_bono = ").append(idPromocionBono);
				query.append(" ) slct ");
				query.append(" where slct.finalmax = ").append(vaConsumoInicio);
				
				rows = jdbcTemplate.queryForInt(query.toString());
				if(rows > 0){ // si existen registros entonces proceder a registrar
					return true;
				}else{
					
					query = new StringBuffer();
					query.append(" select count(*) from ( ");				
					query.append(" 		select ");
					query.append("			min(va_consumo_inicio) as iniciomin ");
					query.append(" 		from clpd_rango_promocion ");
					query.append(" 		where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
					query.append(" 		and st_es_rango_final = '").append(CLPConstantes.ST_FALSO).append("'");
					query.append(" 		and co_promocion_bono = ").append(idPromocionBono);
					query.append(" ) slct ");
					query.append(" where slct.iniciomin = ").append(vaConsumoFin);
					
					rows = jdbcTemplate.queryForInt(query.toString());
					if(rows > 0){ // si existen registros entonces proceder a registrar
						return true;
					}else{
						
						///////////////////////////////////////////////////////////////
						//validando en el caso de los demas rangos (Que es Rango Final)
						///////////////////////////////////////////////////////////////
						
						query = new StringBuffer();
						query.append(" select count(*) from ( ");				
						query.append(" 		select ");
						query.append("			va_consumo_inicio ");
						query.append(" 		from clpd_rango_promocion ");
						query.append(" 		where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
						query.append(" 		and st_es_rango_final = '").append(CLPConstantes.ST_VERDADERO).append("'");
						query.append(" 		and co_promocion_bono = ").append(idPromocionBono);
						query.append(" ) slct ");
						query.append(" where slct.va_consumo_inicio = ").append(vaConsumoFin);
						
						rows = jdbcTemplate.queryForInt(query.toString());
						if(rows > 0){ // si existen registros entonces proceder a registrar
							return true;
						}
						
						return false;
					}
				}						
			}
		}	
		
		return true;
	}

	public boolean validarNoUsanPromocionBono(Long id) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	count(prom.id) ");
		query.append(" from clpm_bono_cliente_persona prom ");
		query.append(" where prom.co_promocion_bono = ").append(id);
		query.append(" and st_bono_cliente_persona = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and st_usado = '").append(CLPConstantes.ST_FALSO).append("'");
		
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			return false;
		}
		
		return true;
	}

	@SuppressWarnings("unchecked")
	public List<ClpbPromocionBono> listarPromocionesBonoVigentes(
			boolean addItemDefault) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	id, de_nombre as deNombre, ");
		query.append(" 	to_char(da_inicio_vigencia, '"+CLPConstantes.DATE_PATTERN+"') as inicioVigencia, ");
		query.append(" 	to_char(da_fin_vigencia, '"+CLPConstantes.DATE_PATTERN+"') as finVigencia, ");
		query.append(" 	va_monto_minimo as vaMontoMinimo, st_promocion_bono as strPromocionBono ");
		query.append(" from clpb_promocion_bono ");
		query.append(" where st_promocion_bono = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and (da_inicio_vigencia <= sysdate and da_fin_vigencia >= sysdate) ");
		query.append(" order by da_fin_vigencia desc ");
		
		List<ClpbPromocionBono> listFinal = new ArrayList<ClpbPromocionBono>();
		List<ClpbPromocionBono> list = findListOfBeans(query.toString(), null, ClpbPromocionBono.class);
		
		if(addItemDefault){
			ClpbPromocionBono bean = new ClpbPromocionBono();
			bean.setId(new Long("-1"));
			bean.setDeNombre("----");
			listFinal.add(bean);
		}
		
		listFinal.addAll(list);		
		return listFinal;
	}

	public int eliminarRangoEnAdelante(String idRangoPromocion,
			String idPromocionBono) {

		String consumoIni = obtenerConsumoInicioDeRango(idRangoPromocion);		
		StringBuffer query = new StringBuffer();
		
		query.append(" delete from clpd_rango_promocion ");
		query.append(" where co_promocion_bono = ").append(idPromocionBono);
		query.append(" and va_consumo_inicio >= ").append(consumoIni);
		
		return jdbcTemplate.update(query.toString());
	}

	public Map<String, Object> verificarSiEsRangoIntermedio(
			String idRangoPromocion, String idPromocionBono) {

		//primero verificando si existen 3 registros como minimo para validar si hay registros intermedios
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	count(id) ");
		query.append(" from clpd_rango_promocion ");
		query.append(" where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and co_promocion_bono = ").append(idPromocionBono);
		
		Map<String,Object> map = new HashMap<String, Object>();
		int rows = jdbcTemplate.queryForInt(query.toString());
		
		if(rows >= 3){
			
			String consumoIni = obtenerConsumoInicioDeRango(idRangoPromocion);			
			query = new StringBuffer();
			
			query.append(" select count(*) from ( ");				
			query.append(" 		select ");
			query.append("			min(va_consumo_inicio) as iniciomin ");
			query.append(" 		from clpd_rango_promocion ");
			query.append(" 		where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
			query.append(" 		and co_promocion_bono = ").append(idPromocionBono);
			query.append(" ) slct ");
			query.append(" where slct.iniciomin = ").append(consumoIni);
			
			rows = jdbcTemplate.queryForInt(query.toString());
			if(rows > 0){
				map.put("detalle", "no_es_registro_intermedio");
				return map;
			}else{
				
				query = new StringBuffer();
				query.append(" select count(*) from ( ");				
				query.append(" 		select ");
				query.append("			max(va_consumo_inicio) as iniciomax ");
				query.append(" 		from clpd_rango_promocion ");
				query.append(" 		where st_rango_promocion = '").append(CLPConstantes.ST_VERDADERO).append("'");
				query.append(" 		and co_promocion_bono = ").append(idPromocionBono);
				query.append(" ) slct ");
				query.append(" where slct.iniciomax = ").append(consumoIni);
				
				rows = jdbcTemplate.queryForInt(query.toString());
				if(rows > 0){
					map.put("detalle", "no_es_registro_intermedio");
					return map;
				}else{
					map.put("detalle", "es_registro_intermedio");
					return map;
				}	
			}
		}
		
		map.put("detalle", "no_es_registro_intermedio");
		return map;
	}
	
	private String obtenerConsumoInicioDeRango(String idRangoPromocion){
		
		StringBuffer query = new StringBuffer();
		query.append(" select va_consumo_inicio from clpd_rango_promocion ");
		query.append(" where id = ").append(idRangoPromocion);
		
		List<Map<String,Object>> list = jdbcTemplate.queryForList(query.toString());
		Map<String,Object> map = list.get(0);
		return String.valueOf(map.get("va_consumo_inicio"));
	}

	public Map<String, Object> verificarPromocionEstaVigente(
			Long idPromocionBono) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	count(id) ");
		query.append(" from clpb_promocion_bono ");
		query.append(" where id = ").append(idPromocionBono);
		query.append(" and (da_inicio_vigencia <= sysdate and da_fin_vigencia >= sysdate) ");
		
		Map<String, Object> map = new HashMap<String, Object>();
		int rows = jdbcTemplate.queryForInt(query.toString());
		if(rows > 0){
			map.put("detalle", "esta_vigente");
		}else{
			map.put("detalle", "no_esta_vigente");
		}
		
		return map;
	}

	@SuppressWarnings("unchecked")
	@Override
	public BNPromocionBono obtenerBNPromocionBono(Long idPromocionBono) {
		
		StringBuffer query = new StringBuffer();
		query.append("select pb.id as coPromocionBono, ");
		query.append("		pb.de_nombre as dePromocionBono, ");
		query.append("		to_char( pb.da_inicio_vigencia, 'dd/MM/yyyy') as desFechaIniVigencia, ");
		query.append("		to_char( pb.da_fin_vigencia, 'dd/MM/yyyy') as desFechaFinVigencia, ");
		query.append("		tb.de_tipo_bono as deTipoBono, ");
		query.append("		tb.va_monto as vaMonto ");
		query.append(" from clpb_promocion_bono pb JOIN clpd_tipo_bono tb ");
		query.append(" 		on pb.co_tipo_bono=tb.id ");
		query.append(" where pb.id=? ");
		
		List<BNPromocionBono> lista = findListOfBeans(query.toString(), new Object[]{idPromocionBono},BNPromocionBono.class);
		if(!lista.isEmpty()){
			return lista.get(0);
		}
		return null;
	} 



	@SuppressWarnings("unchecked")
	public List<BNPromocionEstacion> listadoBNPromocionBono(Long idPromocionBono ){
		StringBuffer query= new StringBuffer();
		
		query.append("select pe.id                    				 as id,");
		query.append("		 pe.co_estacion           				 as coEstacion, ");
		query.append("		 e.co_codigo_cofide        				 as codigoCofide,");
		query.append("		 e.de_estacion             				 as deEstacion, ");
		query.append("		 pe.st_promocion_estacion                as stEstacion ");
		query.append(" from  clpr_promocion_estacion pe join clpb_estacion e ");
		query.append("		 on pe.co_estacion=e.id ");
		query.append(" where e.st_estacion='Y' " +
				" and pe.co_promocion_bono=?");
		query.append(" order by e.de_estacion asc ");

		BNPromocionEstacion bean= new BNPromocionEstacion();
		List<BNPromocionEstacion> lista=null;
		lista=findListOfBeans(query.toString(), new Object[]{idPromocionBono},BNPromocionEstacion.class);
		
		
		if(!lista.isEmpty()){
			for (int j = 0; j < lista.size(); j++) {
				bean= lista.get(j);
				
				if(bean.getStEstacion().equalsIgnoreCase("Y")){
					bean.setEstacionBool(true);
					
				}else if(bean.getStEstacion().equalsIgnoreCase("N")){
					bean.setEstacionBool(false);
				}
			}
		}
		
		return lista;
	}

	@SuppressWarnings("unchecked")
	public List<BNPromocionEstacion> listadoBNEstacion(String numeros){
		
		StringBuffer query= new StringBuffer();
		List<BNPromocionEstacion> lista=null;
		BNPromocionEstacion bean= new BNPromocionEstacion();
		
		query.append("select e.id                      as coEstacion,");
		query.append("		 e.co_codigo_cofide        as codigoCofide,");
		query.append("		 e.de_estacion             as deEstacion");
		query.append(" from  clpb_estacion e ");
		query.append(" where e.st_estacion='Y' ");
		
		
		if(StringUtils.isNotBlank(numeros)){
		query.append(" and e.id NOT IN (").append(numeros).append(") ");	
		}
		query.append(" order by e.de_estacion asc ");

		lista=findListOfBeans(query.toString(), null,BNPromocionEstacion.class);	
		
		if(lista!=null && !lista.isEmpty() ){
			for (int j = 0; j < lista.size(); j++) {
				bean= lista.get(j);
				bean.setEstacionBool(false);
				bean.setId(null);
				
			}
		}
		
		return lista;
		
	}
	
	
	@SuppressWarnings("rawtypes")
	public String guardarPromocionBonoEstacion(
			List queries) {
		
		int[] x= null;
		String[] array=null;
		array= (String[]) queries.toArray(new String[queries.size()]);
		
	
		if(array.length > 0){
			x=jdbcTemplate.batchUpdate(array);
		
		}else if(array.length == 0){
		
		  return CLPConstantes.ERROR;
		}
		
		
		return CLPConstantes.SUCCESS;
		
	}
	
	
	public String getInsert(ClprPromocionEstacion promocionEstacion){
		String sql="";
		
		sql=" insert into clpr_promocion_estacion(id,co_estacion,co_promocion_bono,st_promocion_estacion,co_usuario_creador,da_fecha_creacion) "
			+ " values (seq_promocion_estacion.nextVal,'"+promocionEstacion.getClpbEstacion().getId()+"'," +
			"'"+promocionEstacion.getClpbPromocionBono().getId()+"','"+CLPConstantes.ST_VERDADERO+"','" +
			""+getUsuarioLogueado().getUsername()+"',"
			+" sysdate )";

		return sql;
	}
	
	public String getUpdate(ClprPromocionEstacion promocionEstacion){
		String sql="";
		
		sql+="update clpr_promocion_estacion " +
		" set co_usuario_modificador='"+getUsuarioLogueado().getUsername()+"'," +
		" da_fecha_modificacion=sysdate,";
		if(promocionEstacion.isStPromocionEstacion()){
		sql+=" st_promocion_estacion='"+CLPConstantes.ST_VERDADERO+"'";	
		}else{
		sql+=" st_promocion_estacion='"+CLPConstantes.ST_FALSO+"'";		
		}
		sql+=" where id = "+promocionEstacion.getId();

		return sql;
	}
	





}
